package homework02;

import java.util.Scanner;

/**
 * @Description: TODO
 * @author: shenbing.wang@hand-china
 * @date: 2021年05月31日 11:14
 */
public class Code0202 {

    /*
       * 目标： 编程实现控制台版并支持两人对战的五子棋游戏
          (1)绘制棋盘
          (2)提示黑方（用 1 表示）和白方（用 2 表示）分别下棋（X，Y 轴位
          置）并重新绘制棋盘。
          (3)每当一方下棋后判断是否获胜 。
          (4)提示：采用二维数组来模拟棋盘。
       */
    public static void main(String[] args) {
        //绘制棋盘
        int[][] nums = new int[16][16];
        for (int i = 0; i < nums.length; i++) {
            nums[0][i] = i;
            nums[i][0] = i;
        }
        game:
        while (true) {
            //打印棋盘
            for (int i = 0; i < nums.length; i++) {
                for (int j = 0; j < nums.length; j++) {
                    System.out.print(nums[i][j] + "	");
                }
                System.out.println();
                //System.out.println();
            }

            //下子
            Scanner input = new Scanner(System.in);
            //建立一个数组存放黑方下子坐标
            int[] blackPoint = new int[2];
            //建立一个数组存放白方下子坐标
            int[] whitePoint = new int[2];
            boolean v = true;

            while (v) {
                System.out.println("请黑方下子（请输入下子的坐标）：");
                for (int i = 0; i < blackPoint.length; i++) {
                    blackPoint[i] = input.nextInt();
                }
                if (nums[blackPoint[1]][blackPoint[0]] == 0) {
                    nums[blackPoint[1]][blackPoint[0]] = 1;
                    //在此处插入判断条件
                    v = victory(nums, blackPoint[0], blackPoint[1]);
                    if (!v) {
                        System.out.println("黑方胜利！！");
                        break game;
                    }
                    break;
                } else if (blackPoint[1] == 0 || blackPoint[0] == 0 || blackPoint[0] >= nums.length) {
                    System.out.println("您的坐标输入有误！请重新输入！");
                } else {
                    System.out.println("该位置已有子！请重新输入！");
                }
            }

            //黑方下子后打印一次
            for (int[] num : nums) {
                for (int j = 0; j < nums.length; j++) {
                    System.out.print(num[j] + "	");
                }
                System.out.println();

            }

            while (v) {
                System.out.println("请白方下子（请输入下子的坐标）：");
                for (int i = 0; i < whitePoint.length; i++) {
                    whitePoint[i] = input.nextInt();
                }
                if (nums[whitePoint[1]][whitePoint[0]] == 0) {
                    nums[whitePoint[1]][whitePoint[0]] = 2;
                    //在此处插入判断条件
                    v = victory(nums, whitePoint[0], whitePoint[1]);
                    if (!v) {
                        System.out.println("白方胜利！！");
                        break game;
                    }
                    break;
                } else if (whitePoint[1] == 0 || whitePoint[0] == 0 || whitePoint[0] >= nums.length) {
                    System.out.println("您的坐标输入有误！请重新输入！");
                } else {
                    System.out.println("该位置已有子！请重新输入！");
                    continue;
                }
            }
        }
        //判断是否胜利
    }

    public static boolean victory(int[][] nums, int point1, int point2) {
        //判断落子的邻近是否可以有形成的五个连续的子
        //如果有即放回false给v;
        //定义落子的左边连续相同的个数
        int leftNumber = 0;
        //定义落子的右边连续相同的个数
        int rightNumber = 0;
        //定义落子的上边连续相同的个数
        int upperNumber = 0;
        //定义落子的下边连续相同的个数
        int lowerNumber = 0;
        //定义落子的左上连续相同的个数
        int leftUpperNumber = 0;
        //定义落子的左下连续相同的个数
        int leftLowerNumber = 0;
        //定义落子的右上连续相同的个数
        int rightUpperNumber = 0;
        //定义落子的右下连续相同的个数
        int rightLowerNumber = 0;

        for (int i = 1; point1 - i > 0; i++) {    //往左边数有多少个是连续相同的
            if (nums[point2][point1] == nums[point2][point1 - i]) {
                leftNumber++;
            } else {
                break;
            }
        }
        for (int i = 1; point1 + i < nums.length; i++) {    //往右边数有多少个是连续相同的
            if (nums[point2][point1] == nums[point2][point1 + i]) {
                rightNumber++;
            } else {
                break;
            }
        }
        for (int i = 1; point2 - i > 0; i++) {    //往上边数有多少个是连续相同的
            if (nums[point2][point1] == nums[point2 - i][point1]) {
                upperNumber++;
            } else {
                break;
            }
        }
        for (int i = 1; point2 + i < nums.length; i++) {    //往下边数有多少个是连续相同的
            if (nums[point2][point1] == nums[point2 + i][point1]) {
                lowerNumber++;
            } else {
                break;
            }
        }
        for (int i = 1; point1 - i > 0 && point2 - i > 0; i++) {    //往左上边数有多少个是连续相同的
            if (nums[point2][point1] == nums[point2 - i][point1 - i]) {
                leftUpperNumber++;
            } else {
                break;
            }
        }
        for (int i = 1; point1 + i < nums.length && point2 + i < nums.length; i++) {    //往右下数有多少个是连续相同的
            if (nums[point2][point1] == nums[point2 + i][point1 + i]) {
                rightLowerNumber++;
            } else {
                break;
            }
        }
        for (int i = 1; point1 - i > 0 && point2 + i < nums.length; i++) {    //往左下边数有多少个是连续相同的
            if (nums[point2][point1] == nums[point2 - i][point1 - i]) {
                leftLowerNumber++;
            } else {
                break;
            }
        }
        for (int i = 1; point1 + i < nums.length && point2 - i > 0; i++) {    //往右上数有多少个是连续相同的
            if (nums[point2][point1] == nums[point2 + i][point1 + i]) {
                rightUpperNumber++;
            } else {
                break;
            }
        }
        //判断
        if (leftNumber + rightNumber == 4 || upperNumber + lowerNumber == 4 || leftUpperNumber + rightLowerNumber == 4 || leftLowerNumber + rightUpperNumber == 4) {
            return false;
        } else {
            return true;
        }
    }
}
